package br.com.sgc.dao;

import java.util.List;

import javax.ejb.Stateless;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import br.com.sgc.entities.produto.Produto;
import br.com.sgc.enuns.TipoOrdenacao;

@Stateless
public class ProdutoDao extends GenericDao<Produto> {

	private static final long serialVersionUID = 8758599546753759014L;
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Produto> findAll(Produto modelClass, Long clinicaId,
			Integer startPage, Integer maxPage, String orderField,
			Boolean initializeDependecies, TipoOrdenacao ordenacao) {
		
		Criteria criteria = getCriteria((Class<Produto>)modelClass.getClass());
		createCriteriaRestrictions(criteria, modelClass);
		criteria.setFirstResult(startPage);
		criteria.setMaxResults(maxPage);		
		
		if(orderField != null && !orderField.trim().equals(""))
			if(ordenacao.equals(TipoOrdenacao.ASC)){
				criteria.addOrder(Order.asc(orderField));
			} else {
				criteria.addOrder(Order.desc(orderField));
			}
		
		criteria.add(Restrictions.eq("clinica.id", clinicaId));
		
		List<Produto> lista = criteria.list();
		if(initializeDependecies) {
			for(Produto t : lista){
				initializeDependecies(t);
			}
		}
			
		return lista;
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public Long count(Produto modelClass, Long clinicaId) {
		Long size = 0L;
		Criteria criteria = getCriteria((Class<Produto>)modelClass.getClass());
		createCriteriaRestrictions(criteria, modelClass);
		criteria.setProjection(Projections.rowCount());
		criteria.add(Restrictions.eq("clinica.id", clinicaId));
		size = (Long) criteria.uniqueResult();
        return size;
	}


	private void createCriteriaRestrictions(Criteria criteria, Produto modelClass) {
		if(modelClass != null){
			if(modelClass.getDescricao() != null && !modelClass.getDescricao().isEmpty()){
				criteria.add(Restrictions.eq("descricao", modelClass.getDescricao()));
			}
			
			if(modelClass.getCodigoProduto() != null && !modelClass.getCodigoProduto().isEmpty()){
				criteria.add(Restrictions.eq("codigoProduto", modelClass.getCodigoProduto()));
			}
			
			
		}
		
	}

}
